package modelo.bd;

import java.sql.*;
import java.util.Properties;
import modelo.io.ManejadorArchivos;

public class Conexion {

    private String nombreArchivo;
    private static Conexion instancia;
    private Properties config;
    private Connection con;
    private Statement sentencia;
    private CallableStatement cstmt;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return new CloneNotSupportedException("No se pueden clonar Conexiones");
    }

    private Conexion() {
        nombreArchivo = "../jdbc.properties";
    }

    public static Conexion instancia() {
        if (instancia == null) {
            instancia = new Conexion();
        }
        return instancia;
    }

    public void crear() throws ClassNotFoundException, SQLException, Exception{
        config = ManejadorArchivos.instancia().obtenerArchivoPropiedades(nombreArchivo);
        Class.forName(config.getProperty("bd_driver"));
        con = DriverManager.getConnection(config.getProperty("bd_url"),
                config.getProperty("bd_usuario"), config.getProperty("bd_contrasena"));
    }

    public void ejecutarActualizacion(String query) throws SQLException {
        try {
            sentencia = con.createStatement();
            sentencia.executeUpdate(query);
        } catch (SQLException ex) {
            cerrar();
            throw new SQLException(ex);
        }
    }

    public ResultSet ejecutarConsulta(String query) throws SQLException {
        try {
            sentencia = con.createStatement();
            ResultSet rs = sentencia.executeQuery(query);
            return rs;
        } catch (SQLException ex) {
            cerrar();
            throw new SQLException(ex);
        }
    }

    public ResultSet ejecutarStored(String query) throws SQLException {
        try {
            cstmt = con.prepareCall(query);
            cstmt.execute();
            ResultSet rs = cstmt.getResultSet();
            return rs;
        } catch (SQLException ex) {
            cerrar();
            throw new SQLException(ex);
        }
    }
    
    public void cerrar() throws SQLException {
        try {
            con.close();
        } catch (SQLException ex) {
            throw new SQLException(ex);
        }
    }
}
